/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import connection.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.Cliente;

/**
 * Define as regras de manipulação de dados para o banco de clientes;
 * @author Janio Luiz Antunes
 * @author Marcel Vinicius Kohls
 * @see http://code.google.com/p/sysdesk-java/
 *
 */
public class DAOCliente {

    private final String SQL_ORDER = " ORDER BY cli_nome";
    private final String SQL_LISTA_CLIENTES_ATIVOS = "SELECT cli_codigo, cli_nome, cli_ativo FROM clientes WHERE cli_ativo=true";
    private final String SQL_LISTA_CLIENTES_INATIVOS = "SELECT cli_codigo, cli_nome, cli_ativo FROM clientes WHERE cli_ativo!=true";
    private final String SQL_LISTA_CLIENTES_TODOS = "SELECT cli_codigo, cli_nome, cli_ativo FROM clientes WHERE (cli_ativo!=true or cli_ativo=true)";
    private final String SQL_BUSCA_POR_CODIGO = "SELECT * FROM clientes WHERE cli_codigo = ?";
    private final String SQL_ALTERAR = "UPDATE clientes set cli_nome=?, cli_cnpjcpf=?, cli_endereco=?, cli_bairro=?, cli_cidade=?, cli_telefone=?, cli_email=?, cli_responsavel=?, cli_ativo=?, cli_est_codigo=? WHERE cli_codigo = ?";
    private final String SQL_INCLUIR = "INSERT INTO clientes (cli_nome, cli_cnpjcpf, cli_endereco, cli_bairro, cli_cidade, cli_telefone, cli_email, cli_responsavel, cli_est_codigo) VALUES (?,?,?,?,?,?,?,?,?)";

    public final int SEL_NONE      = -1;
    public final int SEL_ATIVOS    = 0;
    public final int SEL_INATIVOS  = 1;

    /**
     * Retorna um resultSet com o resultado do comando de sql da lista dos clientes
     * 0=Lista ativos, 1=Lista inativos, qualquer outro valor lista todos.
     * @return
     * @throws Exception
     */
    public ResultSet getListaClientes(int pSelectedAtivo, String pNomeCliente) throws Exception {

        String sqlNomeCliente = " ";

        try {
            //prepara filtro de nome de cliente se desejar
            if (pNomeCliente != null && pNomeCliente != "null" && pNomeCliente.trim().length() > 0) {
                sqlNomeCliente = " AND cli_nome LIKE \'"+pNomeCliente+"%\'";
                System.out.println(sqlNomeCliente);
            }

            // executa comando
            if (pSelectedAtivo==0) {
                return Conexao.getStatement().executeQuery(SQL_LISTA_CLIENTES_ATIVOS+sqlNomeCliente+SQL_ORDER);
            } else if(pSelectedAtivo == 1) {
                return Conexao.getStatement().executeQuery(SQL_LISTA_CLIENTES_INATIVOS+sqlNomeCliente+SQL_ORDER);
            } else {
                return Conexao.getStatement().executeQuery(SQL_LISTA_CLIENTES_TODOS+sqlNomeCliente+SQL_ORDER);
            }

           
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * retorna uma instancia de cliente a partir de uma busca no sql 
     * pelo código passado como parametro.
     * @param pCodCliente
     * @return
     * @throws Exception
     */
    public Cliente getClientePorCodigo(int pCodCliente) throws Exception {
        PreparedStatement sqlQuery = null;
        ResultSet sqlResult = null;
        Cliente resultadoCliente = new Cliente();

        try {
            sqlQuery  = Conexao.getConnection().prepareStatement(SQL_BUSCA_POR_CODIGO);
            sqlQuery.setInt(1,  pCodCliente );
            System.out.println( sqlQuery.toString() );
            sqlResult = sqlQuery.executeQuery();

            resultadoCliente = getValorDoResultado(sqlResult);

            return resultadoCliente;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

    }

    /**
     * monta um objeto do tipo cliente, baseado em um retorno de pesquisa de sql em clientes
     * @param pSqlResult
     * @return
     */
    public Cliente getValorDoResultado(ResultSet pSqlResult) throws Exception {
        Cliente objetoRetorno = new Cliente();

        try {

            // apenas define os campos do objeto se realmente retornou resultado
            if (pSqlResult.next()){
                objetoRetorno.setCodigo(pSqlResult.getInt("cli_codigo"));
                objetoRetorno.setNome(pSqlResult.getString("cli_nome"));
                objetoRetorno.setCNPJCPF(pSqlResult.getString("cli_cnpjcpf"));
                objetoRetorno.setEndereco(pSqlResult.getString("cli_endereco"));
                objetoRetorno.setBairro(pSqlResult.getString("cli_bairro"));
                objetoRetorno.setCidade(pSqlResult.getString("cli_cidade"));
                objetoRetorno.setTelefone(pSqlResult.getString("cli_telefone"));
                objetoRetorno.setEmail(pSqlResult.getString("cli_email"));
                objetoRetorno.setResponsavel(pSqlResult.getString("cli_responsavel"));
                objetoRetorno.setEstado(pSqlResult.getInt("cli_est_codigo"));
                objetoRetorno.setAtivo(pSqlResult.getBoolean("cli_ativo"));
            }

        } catch (Exception e) {
            System.out.println("erro: getValorDoResultado: "+e.getMessage());
        }

        return objetoRetorno;
    }

    /**
     * Salva uma instância de cliente no banco. Se tiver código então é uma alteração,
     * se o código for null, então é inclusão.
     * @param pCliente
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean salvar(Cliente pCliente) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pCliente.getCodigo() != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_ALTERAR);

                sqlQuery.setString(1, pCliente.getNome());
                sqlQuery.setString(2, pCliente.getCNPJCPF());
                sqlQuery.setString(3, pCliente.getEndereco());
                sqlQuery.setString(4, pCliente.getBairro());
                sqlQuery.setString(5, pCliente.getCidade());
                sqlQuery.setString(6, pCliente.getTelefone());
                sqlQuery.setString(7, pCliente.getEmail());
                sqlQuery.setString(8, pCliente.getResponsavel());
                sqlQuery.setBoolean(9, pCliente.isAtivo());
                sqlQuery.setInt(10, pCliente.getEstado());
                sqlQuery.setInt(11, pCliente.getCodigo());

                System.out.println("DAOCliente.Salvar(Alterar):");
                System.out.println(sqlQuery.toString());
            }
            // prepara SQL para incluir
            else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_INCLUIR);

                sqlQuery.setString(1, pCliente.getNome());
                sqlQuery.setString(2, pCliente.getCNPJCPF());
                sqlQuery.setString(3, pCliente.getEndereco());
                sqlQuery.setString(4, pCliente.getBairro());
                sqlQuery.setString(5, pCliente.getCidade());
                sqlQuery.setString(6, pCliente.getTelefone());
                sqlQuery.setString(7, pCliente.getEmail());
                sqlQuery.setString(8, pCliente.getResponsavel());
                sqlQuery.setInt(9, pCliente.getEstado());

                System.out.println("DAOCliente.Salvar(Incluir):");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }
}
